package org.zn.note.designpattern;

/**
 * 外观模式（Facade Pattern），门面模式
 * 提供统一的接口，隐藏系统内部的复杂性。定义系统入口。
 * <p>
 * 典型的如slf4j，程序中使用slf4j的api，这样具体实现使用log4j、logback等，程序都不用改。统一接口。
 */
public class Pattern11_Facade {

    public static void main(String[] args) {
        ShapeMaker shapeMaker = new ShapeMaker();
        shapeMaker.drawRectangle();
        shapeMaker.drawSquare();
    }

    // 图形生产者：提供了方便的同时，固化了一些逻辑
    private static class ShapeMaker {
        private Shape rectangle;
        private Shape square;

        ShapeMaker() {
            rectangle = new Rectangle();
            square = new Square();
        }

        void drawRectangle() {
            rectangle.draw();
        }

        void drawSquare() {
            square.draw();
        }
    }

    private interface Shape {
        void draw();
    }

    // 长方形
    private static class Rectangle implements Shape {
        @Override
        public void draw() {
            System.out.println("Rectangle::draw()");
        }
    }

    // 正方形
    private static class Square implements Shape {
        @Override
        public void draw() {
            System.out.println("Square::draw()");
        }
    }
}
